/**
 * 黄浩华封装的微信分享接口
 * <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
 * <script src="/themes/htools/h.wxshare.master.js#heyi"></script>
 * */
(function () {
    //在这里定义分享的内容
    var hasInit = false,//是否注册成功微信js了
        fns = {},//用于存储未注册微信js前调用的函数
        jsApiList = ['chooseWXPay','chooseImage','uploadImage',
            "onMenuShareTimeline","onMenuShareAppMessage",'onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'],
        apis = {
            heyi:'https://heyi.api.189go.cn/index.php/get/getJsApiTicket?url=JS_URL_',
            gaozan:'https://heyi.api.189go.cn/index.php/get/getJsApiTicket/gaozan?url=JS_URL_',
        },
        currUrl = document.currentScript&&document.currentScript.src
            ||document.scripts[document.scripts.length-1].src,
        api = currUrl&&currUrl.split('#')[1],
        weChatJs,
        debug = location.href.indexOf('wxdebug')>=8;

    weChatJs = {

        /**
         * 外面调用这个就可以设置分享,调用这个之后也要等到微信api注册成功之后才生效的。
         * */
        share:function(data){
            if(!data)
                return;
            var self = this;
            if(!hasInit){
                fns['share'] = function(){
                    self.share(data);
                };
                return;
            }
            //分享朋友
            wx.onMenuShareAppMessage(data);
            //分享朋友圈
            wx.onMenuShareTimeline(data);
            //分享到QQ
            wx.onMenuShareQQ(data);
            //分享到腾讯微博
            wx.onMenuShareWeibo(data);
            //分享到QQ空间
            wx.onMenuShareQZone(data);
        },

        /**
         * 打开微信的图片选择界面
         * */
        chooseImage:function (imgNum,fn) {
            var self = this;
            if(!hasInit){
                fns['chooseImage'] = function(){
                    self.chooseImage(imgNum,fn);
                };
                return;
            }

            wx.chooseImage({
                count: imgNum||9, // 默认9
                sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有
                sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机，默认二者都有
                complete: function (res) {
                    fn&&fn(res.localIds||false); // 返回选定照片的本地ID列表，localId可以作为img标签的src属性显示图片
                }
            });
        },

        /**
         * 把用微信js选择的图片上传到微信服务器，并得到这些图片的mediaID
         * 支持单个和多个图片上传
         * @param localId string|array 多个的时候，就传数组。
         * @param fn callable 回调。会判断传入的 localID 是不是合法的，不是合法的不会上传，
         * 并且回调的数组中，跟传入的数组是一一对应的，不合法的那些对应的是 false
         * */
        uploadImage:function (localId,fn) {
            var isSingle = typeof localId === 'string',
                i=0,
                lNum=localId.length,
                serverIds = [],
                uploadGapTime = 89; //上传只能一个个地上，而且每个上完之后不能马上上下一个，所以需要设置时间间隔
            if(isSingle)
                localId = [isSingle];

            startUp();

            function startUp() {
                //由于输入和输出的数据量需要保持一致，所以...
                //ios
                //["wxLocalResource://5208313606171154"]
                //android
                //["weixin://resourceid/a45073bcc8360c39b966a791463d23f9"]
                if(!localId[i]||(localId[i].indexOf('wxLocalResource')<0&&localId[i].indexOf('weixin://resourceid')<0)){
                    pushAndCheckFinish();
                }else{
                    wx.uploadImage({
                        localId: localId[i], // 需要上传的图片的本地ID，由chooseImage接口获得
                        isShowProgressTips: 1, // 默认为1，显示进度提示
                        complete: function (res) {
                            pushAndCheckFinish(res.serverId)// 返回图片的服务器端ID
                        }
                    });
                }
            }

            //把服务器id放进数组，并且判断全部传完了没，没完就下一个
            function pushAndCheckFinish(serverId) {
                serverIds.push(serverId||false);// 返回图片的服务器端ID
                if(fn&&serverIds.length>=lNum){
                    fn(isSingle?serverIds[0]:serverIds)
                }else{
                    setTimeout(startUp,serverId?uploadGapTime:1)//没有服务器id，表示上传失败，上传失败不需要等待
                }
                i++;
            }
        },

        /**
         * 选择图片并上传，上面两个方法的合并，并且带上上传到自家服务器的功能
         * */
        chooseAndUploadImage:function (url,imgNum,fn){
            var t = this;
            t.chooseImage(imgNum,function(localIds){
                if(localIds){
                    t.uploadImage(localIds,function(serverIds){
                        ajax(url,{
                            args:{
                                mediaids:serverIds,
                                gzh:api //这个记得跟后端的对应起来，表示这图片是上传到哪个公众号上的
                            },
                            complete:fn
                        })
                    })
                }
            });
        },

        /**
         * 打开微信支付窗口
         * @param data obj
         * @param data.pack string 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=***）
         * @param data.nonceStr string 支付签名随机串，不长于 32 位
         * @param data.paySign string 采用统一的微信支付 Sign 签名生成方法，注意这里 appId 也要参与签名，
         *                          appId 与 config 中传入的 appId 一致，
         *                          即最后参与签名的参数有 appId, timeStamp, nonceStr, package, signType
         * @param data.signType string 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
         * @param data.timestamp int 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。
         *                          但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
         * @param success string 支付成功后的回调函数,第一个参数是数字:1成功支付,2用户取消了,0遇到bug。第二个参数是微信传回的原始参数
         * */
        chooseWXPay:function (data,success){
            var self = this;
            if(!hasInit){
                fns['chooseWXPay'] = function(){
                    self.chooseWXPay(data,success);
                };
                return;
            }

            if(success){
                data.success = function(res){
                    if(res.errMsg == "chooseWXPay:ok"){
                        success(1,res);
                    }else if(res.errMsg=='chooseWXPay:cancel'){
                        //用户取消了
                        success(2,res);
                    }else {
                        success(0,res);
                    }
                };
                data.fail = function (res) {
                    success(0,res);
                }
            }
            wx.chooseWXPay(data);
        },

        //注册微信js
        init:function(){
            if(hasInit)
                return;

            var url = encodeURIComponent(location.href.split('#')[0]);

            ajax(
                (apis[api]||apis['heyi']).replace('JS_URL_',url),
                function(data){
                    data = JSON.parse(data);
                    if(data.status==1){
                        data = data.data;
                        var config = {
                            debug: debug,
                            appId: data.appid,
                            timestamp: data.timestamp,
                            nonceStr: data.noncestr,
                            signature: data.signature,
                            jsApiList: jsApiList
                        };
                        wx.ready(function(){
                            hasInit = true;
                            runFnsInQueue();
                        });
                        wx.error(function(res){
                            console.log("wx.config:error",res);
                            if(debug){
                                alert(res.errMsg+'\n'+JSON.stringify(config))
                            }
                        });
                        wx.config(config);
                    }
                }
            );
        }
    };

    //执行在队列中的函数,因为有可能外部在js接口未注册成功时调用微信接口。
    function runFnsInQueue() {
        if(hasInit){
            for(var a in fns){
                if(fns.hasOwnProperty(a)&&fns[a]){
                    fns[a]();
                    delete fns[a];
                }
            }
        }
    }

    /**
     * 原生ajax请求
     * @param url String 响应请求的链接
     * @param options object/Function
     * @param options.args Object 传给服务器的参数，也可以使用String，但是内容要用键值对的方式写好，参数之间用&
     * @param options.method String 值："POST"或"GET"。默认：如果有args值就是POST，没有就GET
     * @param options.complete Function 成功或者失败都回调的函数
     * @param options.cache Boolean 是否缓存
     * @param options.dataFormat String 值："JSON": 返回 JSON 数据,"String": 返回 String 数据(ps.现在返回的数据都是原始数据，不会给你转的！)
     *
     * ps.输出的数据可能需要手动转换成json：var data = JSON.parse(data);
     */
    function ajax(url,options){
        var req = new XMLHttpRequest(),
            complete = options.complete||options,
            method = options.method||"POST",
            dataFormat = options.dataFormat||'JSON',
            cache = options.cache||true,
            args = options.args||'';

        url = url+(cache?'':((url.indexOf('?')>=0?'&':'?')+"random="+Math.random()));

        if(complete){
            req.onreadystatechange = function(){
                if (req.readyState==4 && req.status==200){
                    complete(req.responseText);
                }
            }
        }
        req.open(method,url,true);
        var argString;
        if(args){
            req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            argString = '';
            if(typeof args=='string'){
                argString = args;
            }else{
                for(var key in args){
                    if(!(args[key]===undefined||args[key]===null)){
                        if(args[key] instanceof Array){
                            for(var i= 0,sNum=args[key].length;i<sNum;i++){
                                argString += (key + '[]=' + encodeURIComponent(args[key][i]) + '&')
                            }
                        }else{
                            argString += key + '=' + encodeURIComponent(args[key]) + '&';
                        }
                    }

                }
            }
            argString = argString.replace(/(^&+)|(&+$)/g,'');//去掉前后的&符号
        }
        req.send(argString);
    }


    weChatJs.init();

    window.HWechatJs = weChatJs;

}());